package it.gnocco.state;
import it.gnocco.log.Logger;

import java.util.*;

public class HashStati {
	public ArrayList<HashSet<Stato>> array = new ArrayList<HashSet<Stato>>();
	public ArrayList<ArrayList<Stato>> array2 = new ArrayList<ArrayList<Stato>>();
	public static final String CLASS = "HashStati";
	
	public HashStati(int nodi){
		for(int i = 0; i <= nodi; i++){
			array.add(new HashSet<Stato>());
			array2.add(new ArrayList<Stato>());
		}
	}
	
	public boolean add(Stato s){
		boolean fatto = false;
		if(fatto = array.get(s.visitati.size()).add(s)){	
			array2.get(s.visitati.size()).add(s);
			s.index = array2.get(s.visitati.size()).size() -1;
		}
		return fatto;
	}
	
	public Stato compara(Stato s){
		Stato result = s;
		if (s.index != -1){
			result = array2.get(s.visitati.size()).get(s.index);
		} else {
			add(s);
		}
		return result;
	}
	
	public int size(){
		int somma = 0;
		for(int i = 0; i < array.size(); i++)
			somma += array.get(i).size();
		return somma;
	}
	
	public void valorizzaStato(Stato s, double valore){
		if(valore<1.0)
			valore = 1.0;
		if(s.value<valore)
			s.value = valore;
		Stato st = compara(s);
		if(st.value<valore)
			st.value = valore;
	}
	
	public void stampaStati(){
		String METHOD = "stampaStati";
		for(int i = 0; i < array.size(); i++){
			Logger.log(Logger.message, CLASS, METHOD, "gli stati con " + i + " vicini:");
			HashSet<Stato> hs = array.get(i);
			Iterator<Stato> iter = hs.iterator();
			while(iter.hasNext()){
				Logger.log(Logger.message, CLASS, METHOD, "stato: " + iter.next().toString());
			}
		}
	}
	
}
